<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.2">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"wrr123.github.io","root":"/","scheme":"Muse","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.json"};
  </script>

  <meta name="description" content="Optional类的使用概述这是在 Java8 引入的新特性，该类主要用来处理每个程序员都碰到过的麻烦问题——空指针异常(NullPointerException)。 从本质上来说，该类属于包含可选值的封装类（wrapper class），因此它既可以包含对象也可以仅仅为空。 一个简单的栗子： 12345678@Testpublic void whenEmptyValue_thenReturnDe">
<meta property="og:type" content="article">
<meta property="og:title" content="java新特性">
<meta property="og:url" content="https://wrr123.github.io/2020/11/09/java%E6%96%B0%E7%89%B9%E6%80%A7/index.html">
<meta property="og:site_name" content="一缕烟气">
<meta property="og:description" content="Optional类的使用概述这是在 Java8 引入的新特性，该类主要用来处理每个程序员都碰到过的麻烦问题——空指针异常(NullPointerException)。 从本质上来说，该类属于包含可选值的封装类（wrapper class），因此它既可以包含对象也可以仅仅为空。 一个简单的栗子： 12345678@Testpublic void whenEmptyValue_thenReturnDe">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2020-11-09T02:05:06.000Z">
<meta property="article:modified_time" content="2022-02-18T02:52:04.459Z">
<meta property="article:author" content="田园隐士">
<meta property="article:tag" content="java">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://wrr123.github.io/2020/11/09/java%E6%96%B0%E7%89%B9%E6%80%A7/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>java新特性 | 一缕烟气</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="一缕烟气" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">一缕烟气</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">沧海月明珠有泪，蓝田日暖玉生烟</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://wrr123.github.io/2020/11/09/java%E6%96%B0%E7%89%B9%E6%80%A7/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="田园隐士">
      <meta itemprop="description" content="talk is cheap, show me the code">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="一缕烟气">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          java新特性
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2020-11-09 10:05:06" itemprop="dateCreated datePublished" datetime="2020-11-09T10:05:06+08:00">2020-11-09</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2022-02-18 10:52:04" itemprop="dateModified" datetime="2022-02-18T10:52:04+08:00">2022-02-18</time>
              </span>

          
            <span class="post-meta-item" title="阅读次数" id="busuanzi_container_page_pv" style="display: none;">
              <span class="post-meta-item-icon">
                <i class="fa fa-eye"></i>
              </span>
              <span class="post-meta-item-text">阅读次数：</span>
              <span id="busuanzi_value_page_pv"></span>
            </span><br>
            <span class="post-meta-item" title="本文字数">
              <span class="post-meta-item-icon">
                <i class="far fa-file-word"></i>
              </span>
                <span class="post-meta-item-text">本文字数：</span>
              <span>4.3k</span>
            </span>
            <span class="post-meta-item" title="阅读时长">
              <span class="post-meta-item-icon">
                <i class="far fa-clock"></i>
              </span>
                <span class="post-meta-item-text">阅读时长 &asymp;</span>
              <span>4 分钟</span>
            </span>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <h4 id="Optional类的使用"><a href="#Optional类的使用" class="headerlink" title="Optional类的使用"></a><code>Optional</code>类的使用</h4><h5 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h5><p>这是在 Java8 引入的新特性，该类主要用来处理每个程序员都碰到过的麻烦问题——空指针异常(NullPointerException)。</p>
<p>从本质上来说，该类属于包含可选值的封装类（wrapper class），因此它既可以包含对象也可以仅仅为空。</p>
<p>一个简单的栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">whenEmptyValue_thenReturnDefault</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line">    <span class="type">User</span> <span class="variable">user2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">&quot;anna@gmail.com&quot;</span>, <span class="string">&quot;1234&quot;</span>);</span><br><span class="line">    <span class="type">User</span> <span class="variable">result</span> <span class="operator">=</span> Optional.ofNullable(user).orElse(user2);</span><br><span class="line"></span><br><span class="line">    assertEquals(user2.getEmail(), result.getEmail());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<span id="more"></span>
<h5 id="使用Optional来解决空指针的问题？"><a href="#使用Optional来解决空指针的问题？" class="headerlink" title="使用Optional来解决空指针的问题？"></a>使用<code>Optional</code>来解决空指针的问题？</h5><p>使用<code>Optional.ofNullable()</code>将可能为空值的变量作为实参传入到这个方法中，之后使用<code>Optional.ifPresent()（如果实参不为空，就执行该实参的消费方法，否则什么都不做）</code>进行后续操作。</p>
<h4 id="方法引用"><a href="#方法引用" class="headerlink" title="方法引用"></a>方法引用</h4><p>所谓方法引用，是指如果某个方法签名和接口恰好一致，就可以直接传入方法引用。</p>
<p><strong>注意：在这里，方法签名只看参数类型和返回类型，不看方法名称，也不看类的继承关系。</strong></p>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        String[] array = <span class="keyword">new</span> <span class="title class_">String</span>[] &#123; <span class="string">&quot;Apple&quot;</span>, <span class="string">&quot;Orange&quot;</span>, <span class="string">&quot;Banana&quot;</span>, <span class="string">&quot;Lemon&quot;</span> &#125;;</span><br><span class="line">        Arrays.sort(array, String::compareTo);</span><br><span class="line">        System.out.println(String.join(<span class="string">&quot;, &quot;</span>, array));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<h6 id="构造方法引用"><a href="#构造方法引用" class="headerlink" title="构造方法引用"></a>构造方法引用</h6><p>除了可以使用静态方法和实例方法，我们还可以引用构造方法。</p>
<p>引用方法的几种方式：</p>
<ul>
<li><code>对象引用::实例方法</code></li>
<li><code>类名::静态方法</code></li>
<li><code>类名::实例方法</code></li>
</ul>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 引用构造方法</span></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">import</span> java.util.stream.*;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        List&lt;String&gt; names = List.of(<span class="string">&quot;Bob&quot;</span>, <span class="string">&quot;Alice&quot;</span>, <span class="string">&quot;Tim&quot;</span>);</span><br><span class="line">        List&lt;Person&gt; persons = names.stream().map(Person::<span class="keyword">new</span>).collect(Collectors.toList());</span><br><span class="line">        System.out.println(persons);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span> &#123;</span><br><span class="line">    String name;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Person</span><span class="params">(String name)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.name = name;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;Person:&quot;</span> + <span class="built_in">this</span>.name;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<h6 id="引用数组"><a href="#引用数组" class="headerlink" title="引用数组"></a>引用数组</h6><p>引用数组和引用构造器很像，格式为<code>类型[]::new</code>,其中类型可以为基本类型也可以是类。</p>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Function&lt;Integer, int[]&gt; fun = n -&gt; new int[n];</span></span><br><span class="line">Function&lt;Integer, <span class="type">int</span>[]&gt; fun = <span class="type">int</span>[]::<span class="keyword">new</span>;</span><br><span class="line"><span class="type">int</span>[] arr = fun.apply(<span class="number">10</span>);</span><br><span class="line"></span><br><span class="line">Function&lt;Integer, Integer[]&gt; fun2 = Integer[]::<span class="keyword">new</span>;</span><br><span class="line">Integer[] arr2 = fun2.apply(<span class="number">10</span>);</span><br></pre></td></tr></table></figure>
<h4 id="Java-8-中-Collectors-的方法"><a href="#Java-8-中-Collectors-的方法" class="headerlink" title="Java 8 中 Collectors 的方法"></a>Java 8 中 <code>Collectors</code> 的方法</h4><p><code>Collectors</code> 提供了一系列的静态方法供我们使用，通常情况下我们静态导入即可。</p>
<h5 id="类型归纳"><a href="#类型归纳" class="headerlink" title="类型归纳"></a>类型归纳</h5><p>其作用是将元素归纳进可变容器 <code>List, Map, Set, Collection 或者 ConcurrentMap</code>。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Collectors.toList();</span><br><span class="line">  Collectors.toMap();</span><br><span class="line">  Collectors.toSet();</span><br><span class="line">  Collectors.toCollection();</span><br><span class="line">  Collectors.toConcurrentMap();</span><br></pre></td></tr></table></figure>
<h5 id="joining"><a href="#joining" class="headerlink" title="joining"></a>joining</h5><p>将元素以某种规则连接起来。</p>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//   输出 FelordcnTomcatJettyUndertowResin</span></span><br><span class="line"> servers.stream().collect(Collectors.joining());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//   输出 Felordcn,Tomcat,Jetty,Undertow,Resin</span></span><br><span class="line"> servers.stream().collect(Collectors.joining(<span class="string">&quot;,&quot;</span> ));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//   输出 [Felordcn,Tomcat,Jetty,Undertow,Resin]</span></span><br><span class="line"> servers.stream().collect(Collectors.joining(<span class="string">&quot;,&quot;</span>, <span class="string">&quot;[&quot;</span>, <span class="string">&quot;]&quot;</span>)); </span><br></pre></td></tr></table></figure>
<h5 id="collectingAndThen"><a href="#collectingAndThen" class="headerlink" title="collectingAndThen"></a><code>collectingAndThen</code></h5><blockquote>
<p>该方法先执行了一个归纳操作，然后再对归纳的结果进行 <code>Function</code> 函数处理输出一个新的结果。</p>
</blockquote>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 比如我们将servers joining 然后转成大写，结果为： FELORDCN,TOMCAT,JETTY,UNDERTOW,RESIN   </span></span><br><span class="line"> servers.stream.collect(Collectors.collectingAndThen(Collectors.joining(<span class="string">&quot;,&quot;</span>), String::toUpperCase));</span><br></pre></td></tr></table></figure>
<h5 id="groupingBy"><a href="#groupingBy" class="headerlink" title="groupingBy"></a><code>groupingBy</code></h5><blockquote>
<p>按照条件对元素进行分组，和 <strong>SQL</strong> 中的 <code>group by</code> 用法有异曲同工之妙，通常也建议使用 <strong>Java</strong> 进行分组处理以减轻数据库压力。<code>groupingBy</code> 也有三个重载方法</p>
</blockquote>
<ol>
<li><p>第一个</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> &lt;T, K&gt; Collector&lt;T, ?, Map&lt;K, List&lt;T&gt;&gt;&gt;</span><br><span class="line">groupingBy(Function&lt;? <span class="built_in">super</span> T, ? <span class="keyword">extends</span> <span class="title class_">K</span>&gt; classifier) &#123;</span><br><span class="line">    <span class="keyword">return</span> groupingBy(classifier, toList());</span><br><span class="line">&#125;</span><br><span class="line">   </span><br></pre></td></tr></table></figure>
</li>
<li><p>第二个</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> &lt;T, K, A, D&gt;</span><br><span class="line">Collector&lt;T, ?, Map&lt;K, D&gt;&gt; groupingBy(Function&lt;? <span class="built_in">super</span> T, ? <span class="keyword">extends</span> <span class="title class_">K</span>&gt; classifier,</span><br><span class="line">                                      Collector&lt;? <span class="built_in">super</span> T, A, D&gt; downstream) &#123;</span><br><span class="line">    <span class="keyword">return</span> groupingBy(classifier, HashMap::<span class="keyword">new</span>, downstream);</span><br><span class="line">&#125;</span><br><span class="line">   </span><br></pre></td></tr></table></figure>
<p>它可以对元素进行第一次分组之后，再次对另一个字段进行分组</p>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 二次分组，先按类别分组，再按分数分组</span></span><br><span class="line">Map&lt;Integer, Map&lt;Integer, List&lt;Sample&gt;&gt;&gt; second = samples.stream().collect(Collectors.groupingBy(x -&gt; x.type, Collectors.groupingBy(x -&gt; x.score)));</span><br><span class="line"><span class="comment">// 分组后，reduce</span></span><br><span class="line"> Map&lt;Integer, Optional&lt;Integer&gt;&gt; fifth = samples.stream().collect(Collectors.groupingBy(x -&gt; x.type, Collectors.mapping(x -&gt; x.score, Collectors.reducing((x, y) -&gt; x + y))));</span><br><span class="line"><span class="comment">// 分组后，获取最大值</span></span><br><span class="line">Map&lt;Integer, Optional&lt;Sample&gt;&gt; forth = samples.stream().collect(Collectors.groupingBy(x -&gt; x.type, Collectors.maxBy((x, y) -&gt; x.score - y.score)));</span><br></pre></td></tr></table></figure>
</li>
</ol>
<ol>
<li><p>第三个</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> &lt;T, K, D, A, M <span class="keyword">extends</span> <span class="title class_">Map</span>&lt;K, D&gt;&gt;</span><br><span class="line">Collector&lt;T, ?, M&gt; groupingBy(Function&lt;? <span class="built_in">super</span> T, ? <span class="keyword">extends</span> <span class="title class_">K</span>&gt; classifier,</span><br><span class="line">                              Supplier&lt;M&gt; mapFactory,</span><br><span class="line">                              Collector&lt;? <span class="built_in">super</span> T, A, D&gt; downstream) &#123;</span><br><span class="line">&#125;</span><br><span class="line">   </span><br></pre></td></tr></table></figure>
</li>
</ol>
<h5 id="partitioningBy"><a href="#partitioningBy" class="headerlink" title="partitioningBy"></a><code>partitioningBy</code></h5><h5 id="counting"><a href="#counting" class="headerlink" title="counting"></a><code>counting</code></h5><h5 id="maxBy-minBy"><a href="#maxBy-minBy" class="headerlink" title="maxBy/minBy"></a><code>maxBy/minBy</code></h5><p>这个两个方法分别提供了查找大小元素的操作。</p>
<h5 id="summingInt-Long-Double"><a href="#summingInt-Long-Double" class="headerlink" title="summingInt/Long/Double"></a><code>summingInt/Long/Double</code></h5><p>用来做累加计算。</p>
<h5 id="summarizingInt-Long-Double"><a href="#summarizingInt-Long-Double" class="headerlink" title="summarizingInt/Long/Double"></a><code>summarizingInt/Long/Double</code></h5><blockquote>
<p>这三个方法通过对元素某个属性的提取，会返回对元素该属性的统计数据对象，分别对应 <code>IntSummaryStatistics</code>、<code>DoubleSummaryStatistics</code>、<code>LongSummaryStatistics</code></p>
</blockquote>
<h5 id="mapping"><a href="#mapping" class="headerlink" title="mapping"></a>mapping</h5><blockquote>
<p>该方法是先对元素使用 <code>Function</code> 进行再加工操作，然后用另一个<code>Collector</code> 归纳。比如我们先去掉 <code>servers</code> 中元素的首字母，然后将它们装入 <code>List</code> 。</p>
</blockquote>
<p>一个栗子：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// [elordcn, omcat, etty, ndertow, esin]</span></span><br><span class="line"> servers.stream.collect(Collectors.mapping(s -&gt; s.substring(<span class="number">1</span>), Collectors.toList()));</span><br></pre></td></tr></table></figure>
<h5 id="reducing"><a href="#reducing" class="headerlink" title="reducing"></a><code>reducing</code></h5>
    </div>

    
    
    
        

  <div class="followme">
    <p>欢迎关注我的其它发布渠道</p>

    <div class="social-list">

        <div class="social-item">
          <a target="_blank" class="social-link" href="/atom.xml">
            <span class="icon">
              <i class="fa fa-rss"></i>
            </span>

            <span class="label">RSS</span>
          </a>
        </div>
    </div>
  </div>


      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/java/" rel="tag"># java</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/2020/11/06/java%E5%88%9D%E5%A7%8B%E5%8C%96list%E7%9A%84%E9%9B%86%E4%B8%AD%E6%96%B9%E6%B3%95/" rel="prev" title="java初始化list的集中方法">
      <i class="fa fa-chevron-left"></i> java初始化list的集中方法
    </a></div>
      <div class="post-nav-item">
    <a href="/2020/11/10/git-cherry-pick%E7%9A%84%E4%BD%BF%E7%94%A8/" rel="next" title="git-cherry-pick的使用">
      git-cherry-pick的使用 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-4"><a class="nav-link" href="#Optional%E7%B1%BB%E7%9A%84%E4%BD%BF%E7%94%A8"><span class="nav-number">1.</span> <span class="nav-text">Optional类的使用</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#%E6%A6%82%E8%BF%B0"><span class="nav-number">1.1.</span> <span class="nav-text">概述</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#%E4%BD%BF%E7%94%A8Optional%E6%9D%A5%E8%A7%A3%E5%86%B3%E7%A9%BA%E6%8C%87%E9%92%88%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9F"><span class="nav-number">1.2.</span> <span class="nav-text">使用Optional来解决空指针的问题？</span></a></li></ol></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8"><span class="nav-number">2.</span> <span class="nav-text">方法引用</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95%E5%BC%95%E7%94%A8"><span class="nav-number">2.0.1.</span> <span class="nav-text">构造方法引用</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#%E5%BC%95%E7%94%A8%E6%95%B0%E7%BB%84"><span class="nav-number">2.0.2.</span> <span class="nav-text">引用数组</span></a></li></ol></li></ol></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Java-8-%E4%B8%AD-Collectors-%E7%9A%84%E6%96%B9%E6%B3%95"><span class="nav-number">3.</span> <span class="nav-text">Java 8 中 Collectors 的方法</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#%E7%B1%BB%E5%9E%8B%E5%BD%92%E7%BA%B3"><span class="nav-number">3.1.</span> <span class="nav-text">类型归纳</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#joining"><span class="nav-number">3.2.</span> <span class="nav-text">joining</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#collectingAndThen"><span class="nav-number">3.3.</span> <span class="nav-text">collectingAndThen</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#groupingBy"><span class="nav-number">3.4.</span> <span class="nav-text">groupingBy</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#partitioningBy"><span class="nav-number">3.5.</span> <span class="nav-text">partitioningBy</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#counting"><span class="nav-number">3.6.</span> <span class="nav-text">counting</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#maxBy-minBy"><span class="nav-number">3.7.</span> <span class="nav-text">maxBy&#x2F;minBy</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#summingInt-Long-Double"><span class="nav-number">3.8.</span> <span class="nav-text">summingInt&#x2F;Long&#x2F;Double</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#summarizingInt-Long-Double"><span class="nav-number">3.9.</span> <span class="nav-text">summarizingInt&#x2F;Long&#x2F;Double</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#mapping"><span class="nav-number">3.10.</span> <span class="nav-text">mapping</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#reducing"><span class="nav-number">3.11.</span> <span class="nav-text">reducing</span></a></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">田园隐士</p>
  <div class="site-description" itemprop="description">talk is cheap, show me the code</div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">347</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
        <span class="site-state-item-count">53</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
        <span class="site-state-item-count">115</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2022</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">田园隐士</span>
    <span class="post-meta-divider">|</span>
    <span class="post-meta-item-icon">
      <i class="fa fa-chart-area"></i>
    </span>
    <span title="站点总字数">587k</span>
    <span class="post-meta-divider">|</span>
    <span class="post-meta-item-icon">
      <i class="fa fa-coffee"></i>
    </span>
    <span title="站点阅读时长">8:53</span>
</div>
  <div class="powered-by">由 <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> & <a href="https://muse.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Muse</a> 强力驱动
  </div>

        
<div class="busuanzi-count">
  <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
    <span class="post-meta-item" id="busuanzi_container_site_uv" style="display: none;">
      <span class="post-meta-item-icon">
        <i class="fa fa-user"></i>
      </span>
      <span class="site-uv" title="总访客量">
        <span id="busuanzi_value_site_uv"></span>
      </span>
    </span>
    <span class="post-meta-divider">|</span>
    <span class="post-meta-item" id="busuanzi_container_site_pv" style="display: none;">
      <span class="post-meta-item-icon">
        <i class="fa fa-eye"></i>
      </span>
      <span class="site-pv" title="总访问量">
        <span id="busuanzi_value_site_pv"></span>
      </span>
    </span>
</div>








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/muse.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  

  

</body>
</html>
